#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>     // POSIX API（close、write等）

/**
 * 初始化串口（适配DL-30无线模块）
 * 返回值：串口文件描述符（成功），-1（失败）
 */
int uart_init() {
    // 打开USB转TTL对应的串口设备（/dev/ttyUSB0）
    // O_RDWR：读写模式；O_NOCTTY：不将设备作为控制终端；O_NDELAY：非阻塞模式
    int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd < 0) {
        printf("串口打开失败，请检查/dev/ttyUSB0是否存在");
        return -1;
    }

    // 配置串口参数
    struct termios opt;
    tcgetattr(fd, &opt);  // 获取当前串口配置

    // 设置波特率为115200（与STM32、DL-30保持一致）
    cfsetispeed(&opt, B115200);  // 输入波特率
    cfsetospeed(&opt, B115200);  // 输出波特率

    // 配置数据格式：8位数据位，无校验位，1位停止位
    opt.c_cflag |= (CLOCAL | CREAD);  // CLOCAL：忽略调制解调器控制线；CREAD：启用接收
    opt.c_cflag &= ~CSIZE;           // 清除数据位设置
    opt.c_cflag |= CS8;              // 设置8位数据位
    opt.c_cflag &= ~PARENB;          // 无校验位
    opt.c_cflag &= ~CSTOPB;          // 1位停止位（默认）
    opt.c_cflag &= ~CRTSCTS;         // 禁用硬件流控制

    // 应用配置（TCSANOW：立即生效）
    tcsetattr(fd, TCSANOW, &opt);
    return fd;
}

/**
 * 向STM32发送命令并接收响应
 * 参数：uart_fd（串口文件描述符），cmd（要发送的命令）
 * 返回值：STM32的响应字符串
 */
char* send_to_stm32(int uart_fd, const char* cmd) {
    static char resp[128] = {0};  // 静态数组存储响应（确保函数返回后有效）
    memset(resp, 0, sizeof(resp));  // 清空缓冲区

    // 发送命令（带换行符，匹配STM32的结束符）
    // 例如：cmd为"@LED_ON"时，发送"@LED_ON\n"
    char full_cmd[32];
    sprintf(full_cmd, "%s\n", cmd);  // 拼接换行符
    write(uart_fd, full_cmd, strlen(full_cmd));  // 写入串口

    // 读取STM32的响应（最多等待100ms，简单超时处理）
    usleep(100000);  // 等待100ms（确保数据接收完成）
    read(uart_fd, resp, sizeof(resp)-1);  // 读取响应

    return resp;
}


int main() {
    // 必须先输出HTTP响应头
    printf("Content-Type: text/plain\n\n");

    // 读取POST数据（表单格式：status=true&brightness=50）
    char post_data[100] = {0};
    fgets(post_data, sizeof(post_data), stdin);  // 从标准输入读取参数

    // 解析status和brightness
    char status[10] = {0};
    char reverse[10] = {0};
    int speed = 0;
    // 解析 status、speed、reverse
     sscanf(post_data, "status=%[^&]&speed=%d&reverse=%[^&]", status, &speed, reverse);

    // 调试输出（可删除）
    printf("收到参数：status=%s, speed=%d, reverse=%s\n", status, speed, reverse);
    
    // 初始化串口
    int uart_fd = uart_init();
    if (uart_fd < 0) {
        // 串口初始化失败，直接退出
        return 0;
    }

     // 构建JSON命令
    char json_cmd[256];

    // 根据status、speed和reverse构建JSON命令
    if (strcmp(status, "true") == 0) {
        // 风扇开启
        snprintf(json_cmd, sizeof(json_cmd),
                 "{\"device_id\":2,\"action\":1,\"speed\":%d,\"reverse\":\"%s\"}",
                 speed, reverse);
        printf("发送风扇开启命令：%s\n", json_cmd);
        char* stm32_resp = send_to_stm32(uart_fd, json_cmd);
        printf("STM32响应：%s\n", stm32_resp);

    } else if (strcmp(status, "false") == 0) {
        // 风扇关闭
        snprintf(json_cmd, sizeof(json_cmd),
                 "{\"device_id\":2,\"action\":2,\"speed\":0,\"reverse\":\"false\"}");
        printf("发送风扇关闭命令：%s\n", json_cmd);
        char* stm32_resp = send_to_stm32(uart_fd, json_cmd);
        printf("STM32响应：%s\n", stm32_resp);
    }

    // 关闭串口
    close(uart_fd);

    return 0;
}
